/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.persistance.utilisateur;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import javax.persistence.PersistenceException;
import net.etrs.formathlon.entity.formation.Participation;
import net.etrs.formathlon.metier.exception.MetierException;
import net.etrs.formathlon.persistance.utils.AbstractFacade;
import javax.ejb.Stateless;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.entity.utilisateur.Personnel;
import net.etrs.formathlon.entity.utilisateur.Utilisateur;
import net.etrs.formathlon.metier.service.EntiteManager.NiveauHierarchique;
import net.etrs.formathlon.persistance.formation.ParticipationFacade;
import net.etrs.formathlon.persistance.formation.SessionFacade;
import net.etrs.formathlon.persistance.utils.JpaRequestNames;

/**
 * Facade pour la gestion de l'entité Personnel
 * @author OPIF
 */
@Stateless
public class PersonnelFacade extends AbstractFacade<Personnel> {

    @EJB
    UtilisateurFacade utilisateurFacade;
    @EJB
    ParticipationFacade participationFacade;
    @EJB
    SessionFacade sessionFacade;

    /**
     * En archivant le personnel on archive également 
     * ses sessions dispensées et son parcours pédagogique.
     */
    @Override
    public void delete(Personnel t) throws PersistenceException {
        super.delete(t);
        for (Participation participation : t.getParcoursPeda()) {
            participationFacade.delete(participation);
        }
        for (Session session : t.getListSessionDispensee()) {
            sessionFacade.delete(session);
        }
    }

    /**
     * Permet de savoir si le personnel concerné a déjà effectué cette formation.
     * @param personnel
     * @param participation
     * @return Vrai si déjà participé
     */
    public boolean dejaParticipe(Personnel personnel, Participation participation) {
        boolean retour = false;
        if (!personnel.getParcoursPeda().isEmpty()) {
            Iterator<Participation> it = personnel.getParcoursPeda().iterator();
            Participation part;
            while (!retour && it.hasNext()) {
                part = it.next();
                if (part.getFormation().equals(participation.getFormation())) {
                    part.setDateFormation(participation.getDateFormation());
                    participation.setId(part.getId());
                    retour = true;
                }
            }
        }
        return retour;
    }

    /**
     * Renvoie la liste des subordonnés pour un chef.
     * @param utilisateur
     * @return La liste des subordonnés
     * @throws MetierException 
     */
    public List<Personnel> getSubordonnes(Utilisateur utilisateur) throws MetierException {
        List<Personnel> retour = new ArrayList<Personnel>();
        for (Utilisateur util : utilisateurFacade.getSubordonnes(utilisateur)) {
            retour.add(util.getPersonnel());
        }
        return retour;
    }

    /**
     * Renvoie la liste des subordonnés pour un chef.
     * @param entite
     * @param niveau
     * @return La liste des subordonnés
     * @throws MetierException 
     */
    public List<Personnel> getSubordonnes(String entite, NiveauHierarchique niveau) throws MetierException {
        List<Personnel> retour = new ArrayList<Personnel>();
        for (Utilisateur util : utilisateurFacade.getSubordonnes(entite, niveau)) {
            retour.add(util.getPersonnel());
        }
        return retour;
    }

    /*
     * @return Le nombre personnels.
     */
    public Long getNbPersonnels() {
        return (Long) getEm().createNamedQuery(JpaRequestNames.NB_PERSONNELS)
                .getSingleResult();
    }
    
}
